package com.itheima.pinda.file.manager;

import com.itheima.pinda.file.dto.chunk.FileUploadDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.IOException;

/**
 * 封装分片操作的工具类，创建分片临时文件和存放目录
 *
 * @author:ivan.liu
 */
@Component
@Slf4j
public class WebUploader {
    /**
     * 为分片上传提供对应的保存位置，同时创建.tmp的临时文件
     * @param fileUploadDTO
     * @param path
     * @return
     */
    public java.io.File getReadySpace(FileUploadDTO fileUploadDTO,String path){
        boolean b = createFileFolder(path, false);
        if (!b){
            return null;
        }

        //将文件保存到文件名的MD5值构成的目录中
        String fileFolder = fileUploadDTO.getName();
        if (fileFolder==null){
            return null;
        }

        path+="/"+fileFolder;
        //创建临时文件和分片存放目录
        b = createFileFolder(path,true);
        if (!b){
            return null;
        }
        //构造分片文件需要路径
        return new java.io.File(path,String.valueOf(fileUploadDTO.getChunk()));
    }

    /**
     * 具体创建目录和临时文件
     * @param file
     * @param hasTmp
     * @return
     */
    private boolean createFileFolder(String file,boolean hasTmp){
        java.io.File tmpFile = new java.io.File(file);
        if (!tmpFile.exists()){
            try {
                tmpFile.mkdirs();
            } catch (Exception e) {
                log.error("创建分片所在目录失败",e);
                e.printStackTrace();
                return false;
            }
        }
        if (hasTmp){
            //需要创建临时文件
            tmpFile = new java.io.File(file+".tmp");
            if (tmpFile.exists()){
                //临时文件已存在，则修改最后的修改时间
                return tmpFile.setLastModified(System.currentTimeMillis());
            }else {
                //临时文件不存在，创建文件
                try {
                    return tmpFile.createNewFile();
                } catch (IOException e) {
                    log.error("创建临时文件失败",e);
                    e.printStackTrace();
                    return false;
                }
            }
        }
        return true;
    }
}
